package assess

import (
	"encoding/base64"
	"encoding/json"
	"gitcode.com/G-YT/ANN/server/global"
	"gitcode.com/G-YT/ANN/server/model/assess"
	"sort"
	"strings"
	"time"
)

type AssessService struct{}

var habitus = []string{
	"氣虛",
	"氣鬱",
	"痰濕",
	"濕熱",
	"陰虛",
	"陽虛",
	"血瘀",
	"特禀",
	"平和",
}

var birthdayConf = map[int]string{
	0: "血瘀",
	1: "氣虛",
	2: "陰虛",
	3: "陽虛",
	4: "痰濕",
	5: "氣虛",
	6: "濕熱",
	7: "氣鬱",
	8: "氣虛",
	9: "陰虛",
}

type KeyValue struct {
	Key   string
	Value int
}

// QuestionConf 获取所有问题
func (assessService *AssessService) QuestionConf() (data map[string]string, err error) {
	habitus := []string{
		"氣虛",
		"氣鬱",
		"痰濕",
		"濕熱",
		"陰虛",
		"陽虛",
		"血瘀",
		"特禀",
		"平和",
	}

	qConf := map[string]string{
		habitus[0] + "_1": "經常會感覺到疲憊、勞累，是這樣嗎？",
		habitus[0] + "_2": "有個風吹草動就感冒，還容易出汗，咳嗽、哮喘，上述症狀至少有一樣嗎？",
		habitus[0] + "_3": "不愛說話，經常忘東忘西的，頭暈，食慾不振，以上症狀至少有一樣嗎？",
		habitus[0] + "_4": "肌肉或皮膚鬆軟，肚子、手臂、大腿都有贅肉，是這樣嗎？",

		habitus[1] + "_1": "經常感覺到焦慮，是這樣嗎？",
		habitus[1] + "_2": "經常腹脹、嘔吐、乳房脹痛、排氣較多，以上症狀至少有一種嗎？",
		habitus[1] + "_3": "多愁善感、總感慨或者發愁，精神不振、左右肋間痛，以上症狀至少有一樣嗎？",
		habitus[1] + "_4": "您特別不愛活動，是這樣嗎？",

		habitus[2] + "_1": "您的體重超標嗎？",
		habitus[2] + "_2": "經常浮腫、嗜睡、經常吐痰、口中黏膩、睡覺打鼾，以上症狀至少有一樣嗎？",
		habitus[2] + "_3": "糖尿病、高脂血症、高血壓或血壓在三年前開始升高，以上症狀至少有一樣嗎？",
		habitus[2] + "_4": "經常感覺到困乏，白天也想睡覺，是這樣嗎？",

		habitus[3] + "_1": "皮膚愛出油，是這樣嗎？",
		habitus[3] + "_2": "身上或臉上經常起痘，頭髮一天不洗就出油，身體異味大，以上症狀至少有一樣嗎？",
		habitus[3] + "_3": "皮膚容易感染，生殖系統易感染，經常出現癢， 以上症狀至少有一樣嗎？",
		habitus[3] + "_4": "喜歡吃肥甘、辛辣，口味比較重的食物，是這樣嗎？",

		habitus[4] + "_1": "特別怕熱，是這樣嗎？",
		habitus[4] + "_2": "口乾、眼乾、皮膚乾、愛喝水、以上症狀至少有一樣嗎？",
		habitus[4] + "_3": "經常出現潰瘍，晚上睡覺容易出汗，便秘，以上症狀至少有一樣嗎？",
		habitus[4] + "_4": "皮膚粗糙、不潤滑，是這樣嗎？",

		habitus[5] + "_1": "特別怕冷，總穿得比別人多，是這樣嗎？",
		habitus[5] + "_2": "大便不成形，夜尿2次以上，性功能減退，失眠，以上症狀至少有一樣嗎？",
		habitus[5] + "_3": "腰膝酸軟，關節疾病，胸悶氣短，心神不寧，甲減，以上症狀至少有一樣嗎？",
		habitus[5] + "_4": "吃涼東西會不舒服，是這樣嗎？",

		habitus[6] + "_1": "有疼痛的症狀，身體不是這兒疼就是那兒疼，是這樣嗎？",
		habitus[6] + "_2": "心臟病、靜脈曲張、中風、經常出現皮膚淤青，以上症狀至少有一樣嗎？",
		habitus[6] + "_3": "有包塊結節，息肉、腫瘤，皮膚有明顯色斑，以上症狀至少有一樣嗎？",
		habitus[6] + "_4": "經常在刷牙的時候會出血，或者經常流鼻血嗎，是這樣嗎？",

		habitus[7] + "_1": "您有過敏體質嗎？",
		habitus[7] + "_2": "對某種物質過敏，皮膚經常出疹子，不感冒也流鼻涕，以上症狀至少有一樣嗎？",
		habitus[7] + "_3": "哮喘、風團、紫癜、咽癢、鼻塞、蕁麻疹、過敏性紫癜、血友病，以上症狀至少有一樣嗎？",
		habitus[7] + "_4": "您有先天性的疾病嗎？",

		habitus[8] + "_1": "您精力充沛，沒有任何疾病嗎？",
		habitus[8] + "_2": "您皮膚光滑，沒有任何不適症狀嗎？",
		habitus[8] + "_3": "心態平穩，體態適中，是這樣嗎？",
		habitus[8] + "_4": "您對自然環境的變化和社會環境的變化適應力很強嗎？",
	}
	return qConf, nil
}

// CreatePhysiqueQuestionLog 创建体質检测记录
func (assessService *AssessService) CreatePhysiqueQuestionLog(physiqueQuestionLog *assess.PhysiqueQuestionLog) (logID uint, err error) {
	err = global.GVA_DB.Create(physiqueQuestionLog).Error
	logID = physiqueQuestionLog.ID
	return
}

// GetPhysiqueQuestionLog 获取体質检测记录
func (assessService *AssessService) GetPhysiqueQuestionLog(condition map[string]interface{}, fields string) (physiqueQuestionLog assess.PhysiqueQuestionLog, err error) {
	err = global.GVA_DB.Select(fields).Where(condition).Order("created_at Desc").Limit(1).First(&physiqueQuestionLog).Error
	return
}

// GetPhysiqueQuestionList 获取体質检测记录列表
func (assessService *AssessService) GetPhysiqueQuestionList(condition map[string]interface{}, fields string) (physiqueQuestionLog []assess.PhysiqueQuestionLog, err error) {
	err = global.GVA_DB.Select(fields).Where(condition).Order("created_at Desc").Find(&physiqueQuestionLog).Error
	return
}

// GetPhysique 计算用户体質信息
func (assessService *AssessService) GetPhysique(results map[string]int, birthday time.Time) (userPhysique assess.UserPhysique, err error) {
	var data assess.UserPhysique
	item := make(map[string]int)
	// 获取年份
	year := birthday.Year()
	// 取最后一个数字
	lastDigit := year % 10
	for key, value := range results {
		decodedKey, _ := base64.StdEncoding.DecodeString(key)
		keys := strings.Split(string(decodedKey), "_")
		if value == 1 {
			if contains(keys[0], habitus) {
				if _, exists := item[keys[0]]; exists {
					item[keys[0]] += 25
				} else {
					item[keys[0]] = 25
				}
			}
		} else {
			if _, exists := item[keys[0]]; !exists {
				item[keys[0]] = 0
			}
		}
	}
	//fmt.Printf("item: %#v\n", item)
	mantissaKey := birthdayConf[lastDigit]
	item[mantissaKey] += 1
	encodedData := make(map[string]int)
	for key, value := range item {
		// 将键转换为base64编码
		encodedKey := base64.StdEncoding.EncodeToString([]byte(key))
		// 将转换后的键和原始值存储到新的map中
		encodedData[encodedKey] = value
	}

	jsonData, err := json.Marshal(encodedData)
	data.Score = string(jsonData)

	sortedItem := sortMapByValue(item)
	lastItem := sortedItem[len(sortedItem)-1]
	data.Physique = lastItem.Key
	//fmt.Printf("变量类型: %T\n", encodedData)
	//fmt.Printf("变量值: %v\n", encodedData)
	return data, err
}

func contains(item string, list []string) bool {
	for _, value := range list {
		if value == item {
			return true
		}
	}
	return false
}

func sortMapByValue(m map[string]int) []KeyValue {
	var sorted []KeyValue
	for k, v := range m {
		sorted = append(sorted, KeyValue{k, v})
	}
	sort.Slice(sorted, func(i, j int) bool {
		return sorted[i].Value < sorted[j].Value
	})
	return sorted
}
